home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
examples.arc
/
EXAMPL28.PRO
< prev
next >
Wrap
Text File
|
1986-10-07
|
4KB
|
121 lines
/* Program 28 */
domains
monsters=integer*
predicates
delay(integer)
zapGun(integer,integer)
delete(integer,monsters,monsters)
testresult(monsters,integer)
test(char,integer,integer)
doit(integer,monsters,integer)
showThem(monsters,integer,char)
/*
The following predicates have been added to allow the user
to select the number of monsters, to generate a random
starting point, and to move the monsters either up or down
on the screen randomly.
*/
init(integer,monsters)
init1(integer,monsters,monsters)
append(monsters,monsters,monsters)
int_real(integer,real)
increment(integer)
randcol(integer)
goal
makewindow(1,7,0,"",0,0,25,80),
init(Start,Monsters),
doit(Start,Monsters,0).
clauses
doit(Initial,Monsters,Row):-
testresult(Monsters,Row), /* test to see if game is over */
showThem(Monsters,Row,'\1'), /* display monsters */
readchar(Ch), /* get direction to move */
test(Ch,Initial,Final), /* move */
zapGun(24,Final), /* FIRE!!! */
delete(Final,Monsters,LiveMonsters),
increment(X), /* get a random direction to move */
NewRow = Row + X,
cursor(24,Final),
showThem(Monsters,Row,' '), /* erase old monsters */
doit(Final,LiveMonsters,NewRow).
testresult([],_):-
write("\nWell done champion zapper !"),
readchar(_), exit.
testresult(_,Row) :- Row<24,!.
testresult(_,_) :-
write("\nToo late, YOU have been zapped !"),
readchar(_), exit.
showThem([],_,_) :-!.
showThem([Monster|TheRest],Row,Char) :-
Row > -1, !, /* negative rows illegal */
scr_char(Row,Monster,Char),
showThem(TheRest,Row,Char).
showThem(_,_,_) :- !.
zapGun(N,C):-
N>0,!,scr_char(N,C,'^'),delay(150),
scr_char(N,C,' '),N1=N-1,zapGun(N1,C).
zapGun(_,_).
test('z',0,79):-!. /* changed to make the screen wrap */
test('\75',0,79):-!. /* and use arrow keys */
test('x',79,0):-!.
test('\77',79,0):-!.
test('t',_,Col):-randcol(Col),!. /* t-port to a random spot */
/*
the following clauses move the cursor right or left
*/
test('z',OldCol,NewCol):-!,NewCol=OldCol-1.
test('\75',OldCol,NewCol):-!,NewCol=OldCol-1.
test('x',OldCol,NewCol):-!,NewCol=OldCol+1.
test('\77',OldCol,NewCol):-!,NewCol=OldCol+1.
test(_,C,C). /* anything else, stay put */
delete(_,[],[]).
delete(X,[X|R],R):-!.
delete(X,[Y|R],[Y|R2]) :- !,delete(X,R,R2).
delay(N):-N>0,!,N1=N-1,delay(N1).
delay(0).
randcol(Col) :-
random(X),
C = X * 79,
int_real(Col,C), !.
int_real(X,Y) :-
X = Y.
init(Start, Monsters) :-
write("How many monsters do you want to fight? "),
readint(N), /* integer number of monsters */
init1(N, [], Monsters), /* generate list of monsters */
randcol(Start), /* generate start location */
clearwindow,
write("z moves left, x moves right, t to teleport\n"),
write("press any key to begin..."),
readchar(_),
clearwindow, !.
init1(0,Monsters,Monsters). /* no monsters left to make */
init1(N,OldMonst,Monsters) :-
N1 = N - 1,
randcol(Col),
append(OldMonst,[Col],NewMonst),
!,init1(N1,NewMonst,Monsters).
append([],L,L).
append([H|L1],L2,[H|L3]) :-
append(L1,L2,L3).
increment(I) :-
random(Y),
X = Y * 3 - 1,
int_real(I,X).